home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Programs 1995 Summer
/
Linux Programs.iso
/
raytrace
/
radiance.con
/
dxf2rad.lisp
< prev
next >
Wrap
Lisp/Scheme
|
1994-08-07
|
15KB
|
479 lines
; This program runs through the current drawing finding all objects that it
; can extract to a Radiance input file. The layer information is used as the
; material type in Radiance
; The following mappings are implemented at the moment
; AutoCAD to Radiance
; 3DFACE -- polygon
; LINE -- polygon
; CIRCLE -- cylinder
; 3DLINE -- cylinder
; POINT -- sphere
;
; Load the program into AutoCAD by typing the following from Command:
;
; (load "acad2rad")
;
; Run by typing this command from the AutoCAD Command:
;
; acad2rad
;
; Also included is a utility called xpld. This program runs through the
; drawing exploding all polylines into their component lines and 3dfaces
; Run by typing
;
; xpld
;
; by Robert Amor on 12-Aug-90, final tidyup 22-Oct-90
; Mail: School of Architecture
; Victoria University of Wellington
; PO Box 600
; Wellington
; New Zealand
; Phone: +64 4 721 000 x8008
; FAX: +64 4 712 070
; E-mail: trebor@comp.vuw.ac.nz
;==============================================
; Get all the 3D faces from the current drawing
(defun get3dface (fname)
; ssget extracts all entities of a certain type ie 3DFACE
(setq faces (ssget "X" (list (cons 0 "3DFACE"))))
; make sure that some faces exist
(cond ((/= faces nil)
; find out how many entities there are in the set
(setq slen (sslength faces))
(princ "3DFACE: ")
(princ slen)
(princ " being processed.\n")
; loop through each face found, extract the right info and print it
(setq obj 0)
(while (< obj slen)
(faceproc faces obj)
(setq obj (1+ obj))
)
)
(t nil)
)
)
;----------------------------------------------------------------------
; For each 3DFACE in the set, get the layer info and its 4 co-ordinates
(defun faceproc (faces obj)
; find the object number of this face
(setq face (ssname faces obj))
; get the list of attributes for this face
(setq fdata (entget face))
; find the layer in the list, remember that the elements in
; the list are keyed by the DXF file numbers for the attribute
(setq layer (cdr (assoc 8 fdata)))
; find points 1 through 4 from the list
(setq p1 (cdr (assoc 10 fdata)))
(setq p2 (cdr (assoc 11 fdata)))
(setq p3 (cdr (assoc 12 fdata)))
(setq p4 (cdr (assoc 13 fdata)))
; print out all the extracted information
(prinfaces layer p1 p2 p3 p4 obj fname)
)
;-------------------------------------------
; Print out the info from a face to the file
(defun prinfaces (layer p1 p2 p3 p4 obj fname)
; print the layer name as a material type in Radiance
(princ layer fname)
; print the object type, and construct a unique number for it
(princ " polygon poly_" fname)
(princ (1+ obj) fname)
(princ "\n" fname)
; print the info lines as specified in Radiance manual for polygon
(princ "0\n" fname)
(princ "0\n" fname)
(princ "12\n" fname)
; process each point seperately
(prinpoint p1 fname)
(prinpoint p2 fname)
(prinpoint p3 fname)
(prinpoint p4 fname)
(princ "\n" fname)
)
;=======================================================================
; Get all the circles from the current drawing, turn them into cylinders
; NOTE: circle must have thickness thickness=radius of cylinder
(defun getcircle (fname)
; ssget extracts all entities of a certain type ie CIRCLE
(setq circles (ssget "X" (list (cons 0 "CIRCLE"))))
(cond ((/= circles nil)
; find out how many entities there are in the set
(setq slen (sslength circles))
(princ "CIRCLE: ")
(princ slen)
(princ " being processed.\n")
; loop through each circle found, extract the right info and print it
(setq obj 0)
(while (< obj slen)
(circleproc circles obj)
(setq obj (1+ obj))
)
)
(t nil)
)
)
;--------------------------------------------------------------------
; For each CIRCLE in the set, get the layer info and its co-ordinates
(defun circleproc (circles obj)
; find the object number of this circle
(setq circle (ssname circles obj))
; get the list of attributes for this circle
(setq cdata (entget circle))
; find the thickness of the circle to generate the ring radius
; remember that the elements in
; the list are keyed by the DXF file numbers for the attribute
(setq thickness (cdr (assoc 39 cdata)))
; check thickness is greater than 0
(cond ((> thickness 0)
; find the layer the circle is on
(setq layer (cdr (assoc 8 cdata)))
; find center of circle
(setq p1 (cdr (assoc 10 cdata)))
; find the radius of the circle
(setq radius (cdr (assoc 40 cdata)))
; find the plane normal of the circle
(setq plane (cdr (assoc 210 cdata)))
; print out all the extracted information
(princircles layer thickness p1 radius plane obj fname)
)
(t nil)
)
)
;------------------------------------------------
; Print out the info from the circles to the file
(defun princircles (layer thickness p1 radius plane obj fname)
; print the layer name as a material type in Radiance
(princ layer fname)
; print the object type, and construct a unique number for it
(princ " cylinder cyl_circ_" fname)
(princ (1+ obj) fname)
(princ "\n" fname)
; print the info lines as specified in Radiance manual for ring
(princ "0\n" fname)
(princ "0\n" fname)
(princ "7\n" fname)
; print one end of the cylinder
(prinpoint p1 fname)
; find the length of the cylinder by multiplying the thickness by the normal vector
(setq lv (list (* thickness (car plane)) (* thickness (cadr plane)) (* thickness (caddr plane))))
; add the width to the previous point to find the end of the cylinder
(setq p2 (list (+ (car p1) (car lv)) (+ (cadr p1) (cadr lv)) (+ (caddr p1) (caddr lv))))
(prinpoint p2 fname)
(princ " " fname)
(princ thickness fname)
(princ "\n" fname)
(princ "\n" fname)
)
;===================================================================
; Get all 3dlines from the current drawing, turn them into cylinders
; NOTE: line must have thickness thickness=radius line=centreline
(defun get3dline (fname)
;ssget extracts all entities of a certain type ie 3DLINE
(setq lines (ssget "X" (list (cons 0 "3DLINE" ))))
(cond ((/= lines nil)
;find out how many entities there are in the set
(setq slen (sslength lines))
(princ "3DLINE: ")
(princ slen)
(princ " being processed.\n")
;loop through each line found, extract the right info and print
(setq obj 0)
(while (< obj slen)
(line3dproc lines obj)
(setq obj (1+ obj))
)
)
(t nil)
)
)
;-------------------------------------------------------------------
; for each 3DLINE in the set, get the layer info and its coordinates
(defun line3dproc (lines obj)
; find the object number of this line
(setq line (ssname lines obj))
;get the list of attributes for this line
(setq ldata (entget line))
; find the thickness of the line to generate the cylinder radius
; remember that elements in the list are keyed
; by the DXF file numbers for the attribute
(setq thickness (cdr (assoc 39 ldata)))
; check thickness of line is greater than 0
(cond ((> thickness 0)
; find the layer of this line
(setq layer (cdr (assoc 8 ldata)))
;find startpoint of line
(setq p1 (cdr (assoc 10 ldata)))
;find endpoint of line
(setq p2 (cdr (assoc 11 ldata)))
; print out all the extracted information
(prin3dlines layer p1 p2 thickness obj fname)
)
(t nil)
)
)
;----------------------------------------------
;Print out the info from the 3dlines to the files
(defun prin3dlines (layer p1 p2 thickness obj fname)
; print the layer name as a material type in Radiance
(princ layer fname)
; print the object type and construct a unique number for it
(princ " cylinder cyl_3d_" fname)
(princ (1+ obj) fname)
(princ "\n" fname)
; print the info lines as specified in Radiance manual for cylinder
(princ "0\n" fname)
(princ "0\n" fname)
(princ "7\n" fname)
;process each point separately
(prinpoint p1 fname)
(prinpoint p2 fname)
(princ " " fname)
(princ thickness fname)
(princ "\n\n" fname)
)
;================================================================
; Get all points from the current drawing, turn them into spheres
; NOTE: point must have thickness thickness=radius
(defun getpoint (fname)
;ssget extracts all entities of a certain type ie POINT
(setq points (ssget "X" (list (cons 0 "POINT" ))))
(cond ((/= points nil)
;find out how many entities there are in the set
(setq slen (sslength points))
(princ "POINT: ")
(princ slen)
(princ " being processed.\n")
;loop through each point found, extract the right info and print
(setq obj 0)
(while (< obj slen)
(pointproc points obj)
(setq obj (1+ obj))
)
)
(t nil)
)
)
;-------------------------------------------------------------------
; for each POINT in the set, get the layer info and its coordinates
(defun pointproc (points obj)
; find the object number of this point
(setq point (ssname points obj))
;get the list of attributes for this point
(setq pdata (entget point))
; find the thickness of the point to generate the sphere radius
; remember that elements in the list are keyed
; by the DXF file numbers for the attribute
(setq thickness (cdr (assoc 39 pdata)))
; check thickness of point is greater than 0
(cond ((> thickness 0)
; find the layer of this point
(setq layer (cdr (assoc 8 pdata)))
;find center of point
(setq p1 (cdr (assoc 10 pdata)))
; print out all the extracted information
(prinpoints layer p1 thickness obj fname)
)
(t nil)
)
)
;--------------------------------------------
; Print out the info from a point to the file
(defun prinpoints (layer p1 thickness obj fname)
; print the layer name as a material type in Radiance
(princ layer fname)
; print the object type and construct a unique number for it
(princ " sphere sphere_" fname)
(princ (1+ obj) fname)
(princ "\n" fname)
; print the info lines as specified in Radiance manual for sphere
(princ "0\n" fname)
(princ "0\n" fname)
(princ "4\n" fname)
; print out the center of the sphere
(prinpoint p1 fname)
(princ " " fname)
(princ thickness fname)
(princ "\n\n" fname)
)
;========================================================================
; Get all lines from the current drawing, turn them into 3d-faces
; NOTE: line must have thickness thickness=width of face in direction of
; line normal
(defun getline (fname)
;ssget extracts all entities of a certain type ie LINE
(setq lines (ssget "X" (list (cons 0 "LINE" ))))
(cond ((/= lines nil)
;find out how many entities there are in the set
(setq slen (sslength lines))
(princ "LINE: ")
(princ slen)
(princ " being processed.\n")
;loop through each line found, extract the right info and print
(setq obj 0)
(while (< obj slen)
(lineproc lines obj)
(setq obj (1+ obj))
)
)
(t nil)
)
)
;-------------------------------------------------------------------
; for each LINE in the set, get the layer info and its coordinates
(defun lineproc (lines obj)
; find the object number of this line
(setq line (ssname lines obj))
;get the list of attributes for this line
(setq ldata (entget line))
; find the thickness of the line to generate the width of the face
; remember that elements in the list are keyed
; by the DXF file numbers for the attribute
(setq thickness (cdr (assoc 39 ldata)))
; check thickness of line is greater than 0
(cond ((> thickness 0)
; find the layer of this line
(setq layer (cdr (assoc 8 ldata)))
;find startpoint of line
(setq p1 (cdr (assoc 10 ldata)))
;find endpoint of line
(setq p2 (cdr (assoc 11 ldata)))
; get the normal vector of the thickness
(setq normal (cdr (assoc 210 ldata)))
; print out all the extracted information
(prinlines layer p1 p2 thickness normal obj fname)
)
(t nil)
)
)
;----------------------------------------------
;Print out the info from the lines to the files
(defun prinlines (layer p1 p2 thickness normal obj fname)
; print the layer name as a material type in Radiance
(princ layer fname)
; print the object type and construct a unique number for it
(princ " polygon thick_line_" fname)
(princ (1+ obj) fname)
(princ "\n" fname)
; print the info lines as specified in Radiance manual for polygon
(princ "0\n" fname)
(princ "0\n" fname)
(princ "12\n" fname)
;process each point separately
(prinpoint p1 fname)
(prinpoint p2 fname)
; find the width of the face by multiplying the thickness by the normal vector
(setq lv (list (* thickness (car normal)) (* thickness (cadr normal)) (* thickness (caddr normal))))
; add the width to the previous point to find the third point on the face
(setq p3 (list (+ (car p2) (car lv)) (+ (cadr p2) (cadr lv)) (+ (caddr p2) (caddr lv))))
; add the width to the first point to find the last point on the face
(setq p4 (list (+ (car p1) (car lv)) (+ (cadr p1) (cadr lv)) (+ (caddr p1) (caddr lv))))
(prinpoint p3 fname)
(prinpoint p4 fname)
(princ "\n" fname)
)
;==================================================================
; Print out the info for a single point, ie a list of three numbers
; in the Radiance style
(defun prinpoint (point fname)
(princ " " fname)
; print out the x co-ordinate
(princ (car point) fname)
(princ " " fname)
; print out the y co-ordinate
(princ (cadr point) fname)
(princ " " fname)
; print out the z co-ordinate
(princ (caddr point) fname)
(princ "\n" fname)
)
;===========================================================================
; Define a procedure to explode a polyline into its component lines or faces
(defun polyproc (polys obj)
; find the object number of this polyline
(setq poly (ssname polys obj))
; explode the polyline into its components
(command "explode" poly)
)
(defun C:XPLD ()
; ssget extracts all entities of a certain type ie POLYLINE
(setq polys (ssget "X" (list (cons 0 "POLYLINE"))))
; make sure that some polys exist
(cond ((/= polys nil)
; find out how many entities there are in the set
(setq slen (sslength polys))
(princ "POLYLINE: ")
(princ slen)
(princ " being exploded.\n")
; loop through each poly found, extract the right info and explode it
(setq obj 0)
(while (< obj slen)
(polyproc polys obj)
(setq obj (1+ obj))
)
)
(t
(princ "No POLYLINE\n"))
)
)
;============================================================
; Process the drawing file, ask for a file name to create and
; process the types defined,
(defun C:ACAD2RAD ()
; get the name of the file to create
(setq file (getstring "\nWhat Radiance file to create: "))
; open the file to write to
(setq fname (open file "w"))
; process all supported types
(get3dface fname)
(getcircle fname)
(get3dline fname)
(getpoint fname)
(getline fname)
; ALL NEW PROCEDURES TO EXTRACT OTHER TYPES OF OBJECTS FROM AUTOCAD
; SHOULD BE CALLED FROM HERE, AND FOLLOW THE STRUCTURE OF THE
; PROCEDURES DEFINED ABOVE
;
(princ "Done\n")
; close the file after we have finished writing everything to it
(close fname)
)